#include <gtkmm/drawingarea.h>
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <cairomm/context.h>
#include <iostream>
class MyArea : public Gtk::DrawingArea
{
public:
    MyArea();
    virtual ~MyArea();
protected:
    virtual bool on_expose_event(GdkEventExpose* event);
    
private:
    typedef Cairo::RefPtr<Cairo::Context> CR;
    CR cr_;
    class Chess
    {
    public:
        Chess(CR);
        bool on_timer(CR);    
    };
    Chess* pChess_;
};
MyArea::MyArea()
{

}
MyArea::~MyArea()
{
}
MyArea::Chess::Chess(CR cr)
{
    sigc::slot<bool> timer_slot =sigc::bind(
        sigc::mem_fun(*this, &MyArea::Chess::on_timer), cr);
    sigc::connection conn = Glib::signal_timeout().connect(timer_slot, 1000);    
}

bool MyArea::Chess::on_timer(CR cr)
{
    static int x = 0;
    static int y = 0;
    std::cout << "on_timer:(" << x << ", " << y << ")" << std::endl;    
    cr->move_to(x, 0);
    cr->line_to(x++, y++);
    cr->stroke();
    return true;
}

bool MyArea::on_expose_event(GdkEventExpose* event)
{
    Glib::RefPtr<Gdk::Window> window = get_window();
    Cairo::RefPtr<Cairo::Context> cr = window->create_cairo_context();
    pChess_ = new Chess(cr);
    return true;
}
int main(int argc, char** argv)
{
    Gtk::Main kit(argc, argv);
    Gtk::Window win;
    win.set_title("DrawingArea");
    MyArea area;
    win.add(area);
    area.show();
    Gtk::Main::run(win);
    return 0;
}
